/**
 * reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数，每一次运行 reducer 会将先前元素的计算结果作为参数传入，
 * 最后将其结果汇总为单个返回值。

redudeRight和reduce差不多，只不过从后面往前面遍历

 * @param {*} callback 
 * @param {*} initVal 
 */
Array.prototype.myReduceRight = function (callback, initVal) {
  if (typeof callback != "function") {
    throw new TypeError("callback is a function o~");
  }

  // 数组不能为空
  if (!this.length) {
    throw new Error("Reduce of empty array with no initial value");
  }

  const len = this.length;
  let cacleRes = initVal ?? this[len - 1]; // 取初始值
  const startIndex = initVal == null ? len - 2 : len - 1; // 开始元素

  for (let i = startIndex; i >= 0; i--) {
    cacleRes = callback(cacleRes, this[i], i, this);
  }
  return cacleRes;
};

// egg
let arr = [1, 2, 3, 4, 5];
const res = arr.myReduceRight((a, b, i) => {
  console.log("[ i ] >", i);
  return a + b;
});
console.log("[ res ] >", res);

const res2 = arr.reduceRight((a, b, i) => {
  console.log("[ i ] >", i);
  return a + b;
});
console.log("[ ress2 ] >", res2);
